package basededatos;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import org.apache.commons.dbutils.QueryRunner;
import com.mysql.jdbc.PreparedStatement;
import dominio.Avion;
import dominio.Cliente;
import dominio.Hotel;
import dominio.Lugar;
import dominio.Paquete;
import dominio.Reserva;
import dominio.Vuelo;



public class DAO {
	
public ArrayList<Paquete> ConsultarPaquetes() throws SQLException{
		
		ArrayList<Paquete> paquetes = new ArrayList<Paquete>();
		
		ConexionBD conexion = new ConexionBD();
		conexion.Abrir();
		
		ResultSet rs = conexion.RealizarConsulta("call Paqueteslistar");
		
		while(rs.next())
		{
			Lugar lugarDestino = new Lugar();
			lugarDestino.setPais(rs.getString(2));
			lugarDestino.setProvincia(rs.getString(3));
			lugarDestino.setCiudad(rs.getString(4));
			
			Vuelo vueloIda = new Vuelo();
			vueloIda.setLugarDestino(lugarDestino);
			vueloIda.setFechaSalida(rs.getTimestamp(6));
			
			Vuelo vueloVuelta = new Vuelo();
			vueloVuelta.setFechaSalida(rs.getTimestamp(7));
			
			Hotel hotel = new Hotel();
			hotel.setNombre(rs.getString(5));
			
			Paquete paquete = new Paquete();
			paquete.setId(rs.getInt(1));
			paquete.setHotel(hotel);
			paquete.setVueloIda(vueloIda);
			paquete.setVueloVuelta(vueloVuelta);
			
			paquetes.add(paquete);
		}
		
		conexion.Cerrar();
		
		return paquetes;
	}
	
	
	public ArrayList<Vuelo> ConsultarVuelos() throws SQLException{
		
		ArrayList<Vuelo> vuelos = new ArrayList<Vuelo>();
		
		ConexionBD conexion = new ConexionBD();
		conexion.Abrir();
		
		ResultSet rs = conexion.RealizarConsulta("call Vueloslistar");
		
		while(rs.next())
		{
			Lugar origen = new Lugar();
			origen.setCiudad(rs.getString(3));
			
			Lugar destino = new Lugar();
			destino.setCiudad(rs.getString(4));
			
			Avion avion = new Avion();
			avion.setModelo(rs.getString(5));
			
			Vuelo vuelo = new Vuelo();
			
			vuelo.setId(rs.getInt(1));
			vuelo.setFechaSalida(rs.getTimestamp(2));
			vuelo.setLugarOrigen(origen);
			vuelo.setLugarDestino(destino);
			vuelo.setAvion(avion);
			vuelo.setPrecio(rs.getFloat(6));
			
			vuelos.add(vuelo);
		}
		
		conexion.Cerrar();
		
		return vuelos;
	}
	
	
	public ArrayList<Cliente> ConsultarClientes() throws SQLException{
		
		ArrayList<Cliente> clientes = new ArrayList<Cliente>();
		
		ConexionBD conexion = new ConexionBD();
		conexion.Abrir();
		
		ResultSet rs = conexion.RealizarConsulta("call ClientesListar");
		
		while(rs.next())
		{
			Cliente cliente= new Cliente();
			
			cliente.setDni(rs.getString(1));
			cliente.setNombre(rs.getString(2));
			cliente.setApellido(rs.getString(3));
			cliente.setTelefono(rs.getString(4));
			cliente.setEmail(rs.getString(5));
			
			clientes.add(cliente);
		}
		
		conexion.Cerrar();
		
		return clientes;
	}
	
	
	public ArrayList<Reserva> ConsultarReservas() throws SQLException{
		
		ArrayList<Reserva> reservas = new ArrayList<Reserva>();
		
		ConexionBD conexion = new ConexionBD();
		conexion.Abrir();
		
		ResultSet rs = conexion.RealizarConsulta("call ReservasListar");
		
		while(rs.next())
		{
			Reserva reserva= new Reserva();
			
			reserva.setIdReserva(rs.getInt(1));
			reserva.setIdServicio(rs.getInt(2));
			reserva.setObservaciones(rs.getString(3));
			reserva.setTipoServicio(rs.getBoolean(4));
			reserva.setPrecioFinal(rs.getFloat(5));
			
			reservas.add(reserva);
		}
		
		conexion.Cerrar();
		
		return reservas;
	}

	
	public ArrayList<AuxClientesXReservas> ConsultarClientesXReserva(int idReserva) throws SQLException{
		
		ArrayList<AuxClientesXReservas> clientesXreserva = new ArrayList<AuxClientesXReservas>();
		
		ConexionBD conexion = new ConexionBD();
		PreparedStatement preparedStatement = null;
		ResultSet rs = null;
		
		conexion.Abrir();

		preparedStatement = (PreparedStatement) conexion.getConexion().prepareStatement("call ClientesAveriguarXIDReserva(?)");
		preparedStatement.setInt(1, idReserva);

		rs = preparedStatement.executeQuery();
		
		
		while(rs.next())
		{
			AuxClientesXReservas cxr = new AuxClientesXReservas();
			
			cxr.setDniCliente(rs.getString(1));
			cxr.setIdReserva(rs.getInt(2));
			
			clientesXreserva.add(cxr);
		}
		
		conexion.Cerrar();
		
		return clientesXreserva;
	}
	
	
	
	public void AgregarReserva(Reserva reserva, String[] clientesSeleccionados) throws SQLException{
		
		ConexionBD conexion = new ConexionBD();
		QueryRunner run = new QueryRunner();
	
		conexion.Abrir();
		run.update(conexion.getConexion(), "call ReservaInsertar(?, ?, ?, ?)",
											reserva.getIdServicio(),
											reserva.getObservaciones(),
											reserva.isTipoServicio(),
											reserva.getPrecioFinal());
		
		for (String dniCliente : clientesSeleccionados) 
			run.update(conexion.getConexion(), "call ClienteAsignarAReserva(?)", dniCliente);
		
		conexion.Cerrar();
		
	}
	
	
	public void ModificarReserva(Reserva reserva, String[] clientesSeleccionados) throws SQLException{
		
		ConexionBD conexion = new ConexionBD();
		QueryRunner run = new QueryRunner();
	
		conexion.Abrir();
		run.update(conexion.getConexion(), "call ReservaModificar(?, ?, ?, ?)",
											reserva.getIdReserva(),
											reserva.getIdServicio(),
											reserva.getObservaciones(),
											reserva.getPrecioFinal());
		
		
		run.update(conexion.getConexion(), "call ClientesBorrarEnReserva(?)", reserva.getIdReserva());
		
		for (String dniCliente : clientesSeleccionados) 
			run.update(conexion.getConexion(), "call ClienteModificarEnReserva(?, ?)", dniCliente, reserva.getIdReserva());
		
		conexion.Cerrar();
		
	}
	
	
	public int ConsultarDisponibilidadVuelo(int idVuelo) throws SQLException{
		
		int disponibilidad = 0;
		
		ConexionBD conexion = new ConexionBD();
		PreparedStatement preparedStatement = null;
		ResultSet rs = null;
		
		conexion.Abrir();
		
		preparedStatement = (PreparedStatement) conexion.getConexion().prepareStatement("call VueloAveriguarDisponibilidadAsientos(?)");
		preparedStatement.setInt(1, idVuelo);

		rs = preparedStatement.executeQuery();
		
		while(rs.next())
			disponibilidad = rs.getInt(1);
		

		conexion.Cerrar();
	
		return disponibilidad;
	}
	
	
	public int[] ConsultarDisponibilidadPaquete(int idPaquete) throws SQLException{

		int[] disponibilidades = new int[2];
		
		ConexionBD conexion = new ConexionBD();
		PreparedStatement preparedStatement = null;
		ResultSet rs = null;
		
		conexion.Abrir();
		
		preparedStatement = (PreparedStatement) conexion.getConexion().prepareStatement("call VuelosIdaVueltaAveriguarXIDPaquete(?)");
		preparedStatement.setInt(1, idPaquete);

		rs = preparedStatement.executeQuery();
		
		while(rs.next()){
			disponibilidades[0] = ConsultarDisponibilidadVuelo (rs.getInt(1));
			disponibilidades[1] = ConsultarDisponibilidadVuelo (rs.getInt(2));
		}
			
		conexion.Cerrar();
	
		return disponibilidades;
	}
	
	
	public float ConsultarPrecioPaquete(int idPaquete) throws SQLException{
		
		float precio = 0;
		
		ConexionBD conexion = new ConexionBD();
		PreparedStatement preparedStatement = null;
		ResultSet rs = null;
		
		conexion.Abrir();
		
		preparedStatement = (PreparedStatement) conexion.getConexion().prepareStatement("call PaqueteAveriguarPrecio(?)");
		preparedStatement.setInt(1, idPaquete);

		rs = preparedStatement.executeQuery();
		
		while(rs.next())
			precio = rs.getFloat(1);
		

		conexion.Cerrar();
	
		return precio;
	}


	public Hotel ConsultarHotel(int IDHotel) throws SQLException{
		
		Lugar lugar = new Lugar();
		Hotel hotel = new Hotel();
		
		ConexionBD conexion = new ConexionBD();
		PreparedStatement preparedStatement = null;
		ResultSet rs = null;
		
		conexion.Abrir();
		
			preparedStatement = (PreparedStatement) conexion.getConexion().prepareStatement("call HotelAveriguarXID(?)");
			preparedStatement.setInt(1, IDHotel);
	
			rs = preparedStatement.executeQuery();
			
			while(rs.next()){
				lugar.setPais(rs.getString(1));
				lugar.setProvincia(rs.getString(2));
				lugar.setCiudad(rs.getString(3));
				hotel.setNombre(rs.getString(4));
				hotel.setDireccion(rs.getString(5));
				hotel.setCategoria(rs.getString(6));
			}		
		hotel.setLugar(lugar);
		
		conexion.Cerrar();
		
		return hotel;
	}
	
}